<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta
      name="viewport"
      content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no, viewport-fit=cover"
    />
    <meta http-equiv="X-UA-Compatible" content="ie=edge" />
    <title>Virtual Reality</title>
    <link rel="stylesheet" href="/css/examples.css?ver=1.0.0" />
    <script src="/js/examples.js?ver=1.1.1"></script>
    <script src="/lib/enable3d/enable3d.framework.0.22.0.min.js"></script>
  </head>

  <body>
    <div id="info-text">Get your Phone, click Enter VR, tab on the screen and look around.</div>
    <script>
      const { Project, Scene3D, PhysicsLoader, THREE } = ENABLE3D

      class MainScene extends Scene3D {
        move = false

        constructor() {
          super({ enableXR: true })
        }

        update() {
          if (this.webXR.isPresenting && this.move) {
            // move in the direction of the view
            const cam = this.webXR.camera
            const v3 = new THREE.Vector3()
            const distance = 0.02
            cam.getWorldDirection(v3)
            cam.position.add(v3.multiplyScalar(distance))
          }
        }

        async create() {
          this.warpSpeed('-orbitControls')
          this.camera.position.set(10, 10, 10)
          this.camera.lookAt(0, 0, 0)

          setInterval(() => {
            const x = Math.random() * 10 - 5
            const z = Math.random() * 10 - 5
            const ball = this.physics.add.sphere({ y: 50, x, z, radius: 0.5 }, { lambert: { color: 'red' } })
            ball.body.setBounciness(0.7)

            setTimeout(() => {
              this.destroy(ball)
            }, 20000)
          }, 2000)

          const onSelectStart = () => {
            this.move = true
          }

          const onSelectEnd = () => {
            this.move = false
          }

          const controller = this.webXR.getController(0)
          const controllerGrip = this.webXR.getControllerGrip ? this.webXR.getControllerGrip(0) : null

          controller.addEventListener('select', () => {})
          controller.addEventListener('selectstart', onSelectStart)
          controller.addEventListener('selectend', onSelectEnd)

          controller.addEventListener('squeeze', () => {})
          controller.addEventListener('squeezestart', onSelectStart)
          controller.addEventListener('squeezeend', onSelectEnd)

          controller.addEventListener('connected', event => {
            const ray = this.webXR.getControllerRay(event.data)
            if (ray) controller.add(ray)
          })
          controller.addEventListener('disconnected', () => {
            controller.remove(controller.children[0])
          })
        }
      }

      PhysicsLoader('/lib/ammo/kripken', () => new Project({ scenes: [MainScene], antialias: true }))
    </script>
  </body>
</html>
